Amazon Data Firehoseは、必ずしも設定したバッファ間隔やバッファサイズ通りに動作するとは限りません
困っていること
Amazon Data Firehoseのデータ送信先をAmazon S3バケットに設定し、データ送信元からFirehoseストリームにレコードを送信する場合、設定したバッファリング間隔やバッファリングサイズを満たしていても、S3バケットに複数のファイルとして保存されることがあります。
保存された複数のファイルには、データの重複は確認されませんでした。
原因と対策を教えて下さい。
Firehoseストリームは、バッファリング間隔とバッファリングサイズ以外の設定をデフォルトのまま作成しています。
- AWS Lambda でソースレコードを変換:無効
- 動的パーティショニング:無効
- データレコードの圧縮:無効
結論
理由は、Firehoseストリームが設定したバッファリング間隔やバッファリングサイズに厳密に従わないためです。
Firehoseストリームへの送信レコード数が多い場合など、Firehoseストリームはバッファリング期間内であってもファイルを分割して保存することがあります。
その結果、S3バケットに複数のファイルが保存されることになります。
Describes hints for the buffering to perform before delivering data to the destination. These options are treated as hints, and therefore Firehose might choose to use different values when it is optimal. The SizeInMBs and IntervalInSeconds parameters are optional.
日本語訳:データを送信先に配信する前に実行するバッファリングに関するヒントを説明します。これらのオプションはあくまでヒントとして扱われるため、Firehose は最適な場合に異なる値を使用することがあります。SizeInMBs(バッファサイズ)およびIntervalInSeconds(バッファ間隔)のパラメータは任意です。
https://docs.aws.amazon.com/ja_jp/firehose/latest/APIReference/API_BufferingHints.html
引用元のAWSドキュメントに記載されているData Firehoseのバッファリングヒントオプション(BufferingHints
)は以下の2つのパラメータを指します
- BufferingHints.SizeInMBs
- データのバッファリングサイズをMB単位で指定
- 1〜128 MBの範囲で設定可能
- デフォルトは5MB
- BufferingHints.IntervalInSeconds
- データのバッファリング時間を秒単位で指定
- 0〜900秒(15分)の範囲で設定可能
- デフォルトは300秒(5分)
これらが「ヒント」として扱われる理由は、Firehoseが最適化のために設定したバッファリングとは異なる挙動を取る場合があるためです。
つまり、これらの値は厳密な制限値ではなく、Firehoseの動作を導くための参考値として扱われます。
また、ドキュメントには、データのバッファリングサイズは、10秒間に取り込むデータ量よりも大きい値に設定することを推奨しています。
たとえば、通常 1 MiB/秒でデータを取り込む場合、値は 10 MiB 以上にする必要があります。
We recommend setting this parameter to a value greater than the amount of data you typically ingest into the Firehose stream in 10 seconds. For example, if you typically ingest data at 1 MiB/sec, the value should be 10 MiB or higher.
https://docs.aws.amazon.com/ja_jp/firehose/latest/APIReference/API_BufferingHints.html
対策として、バッファリング間隔を長くし、バッファリングサイズを大きくすることで、ファイルが分割される可能性を低減できる場合があります。
ただし、設定されたバッファリング間隔に必ずしも従って送信されるわけではない点に注意が必要です。
データの重複について
余談ですが、送信先によってはデータが重複する可能性があります。
Amazon Data Firehoseは「最低1回配信セマンティクス(At-Least-Once Delivery Semantics)」を採用しているため、特定の状況下でデータ配信が再試行されることがあります。
たとえば、データ配信がタイムアウトしたり、一時的なエラーが発生した場合、Firehoseはデータ配信を再試行します。この再試行により、同じデータが送信先に複数回保存される可能性があります。
Amazon Data Firehose は、データ配信に最低 1 回セマンティクスを使用します。データ配信がタイムアウトした場合など、状況によっては、元のデータ配信リクエストが最終的に通過すると、Amazon Data Firehose による配信の再試行が重複する可能性があります。これは、Apache Iceberg テーブルと Snowflake の宛先を除いて、Amazon Data Firehose がサポートするすべての宛先タイプに適用されます。
https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/basic-deliver.html
参考